💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    20 ViewSet & Router 기본 사용법 | ✅ 편저: 코담 운영자

    20-ViewSet & Router 기본 사용법

    - ViewSet & Router 기본 사용법

    🔗 소스 1: bugbytes-io/drf-course-api

    🔗 소스 2: braverokmc79/Django_REST_Framework_Series


    1. 개요

    이번 강의에서는 Django REST Framework(DRF)의 ViewSetRouter의 개념 및 사용법을 학습합니다. 반복되는 API 뷰 코드를 간소화하고 RESTful한 URL 구조를 자동으로 생성하기 위해 이 기능들을 적극 활용할 수 있습니다.


    2. ViewSet이란?

    • ViewSet은 관련된 여러 HTTP 요청 처리 로직(list, create, retrieve, update, destroy)을 하나의 클래스에 통합한 구조입니다.
    • DRF의 APIViewGenericAPIView처럼 get(), post() 메서드를 직접 다루는 대신, ViewSet은 "행위 중심(Action-based)" 메서드를 사용합니다.
    • 기존 APIView 또는 GenericAPIView처럼 HTTP 메서드(GET, POST 등)를 직접 다루는 대신,
    def list(self, request): ...
    def create(self, request): ...
    def retrieve(self, request, pk=None): ...
    def update(self, request, pk=None): ...
    def destroy(self, request, pk=None): ...
    
    • 등의 액션 메서드를 사용
    from rest_framework import viewsets
    
    class OrderViewSet(viewsets.ModelViewSet):
        queryset = Order.objects.all()
        serializer_class = OrderSerializer
        permission_classes = [AllowAny]  # 일단 인증 없이 열어둠 (다음 강의에서 수정)
    
    • ModelViewSet을 상속하면 CRUD를 자동 지원
    • 기존의 ListAPIView, CreateAPIView 등을 통합하는 형태

    ModelViewSet이 자동 지원하는 CRUD 액션 메서드

    메서드 이름 기능 HTTP 메서드 엔드포인트 예시
    list() 목록 조회 GET /orders/
    retrieve() 단건 조회 GET /orders/1/
    create() 생성 POST /orders/
    update() 전체 수정 PUT /orders/1/
    partial_update() 부분 수정 PATCH /orders/1/
    destroy() 삭제 DELETE /orders/1/
    ✨ 즉, ModelViewSetListAPIView, CreateAPIView, RetrieveAPIView, UpdateAPIView, DestroyAPIView 등을 통합한 올인원 클래스입니다.

    3. Router란?

    • ViewSet은 URL 설정이 별도로 필요
    • DRF의 Router는 ViewSet과 연결된 URL들을 자동으로 생성해주는 기능 제공
    from django.urls import path
    from django.shortcuts import redirect
    from . import views
    from rest_framework.routers import DefaultRouter
    
    urlpatterns = [
    		...
    # path('orders/', views.OrderListAPIView.as_view()),
    # path('user-orders/', views.UserOrderListAPIView.as_view(), name='user-orders'),
    ]
    
    router = DefaultRouter()
    router.register('orders', views.OrderViewSet)
    urlpatterns += router.urls
    
    

    views.py

    from rest_framework import generics ,filters , viewsets
    
    class OrderViewSet(viewsets.ModelViewSet):
        queryset = Order.objects.prefetch_related('items__product')
        serializer_class = OrderSerializer
        permission_classes = [IsAuthenticated]
        pagination_class = None
    
      
    # class OrderListAPIView(generics.ListAPIView):
    #     queryset = Order.objects.prefetch_related('items__product')
    #     serializer_class = OrderSerializer
    
      
    # class UserOrderListAPIView(generics.ListAPIView):
    #     queryset = Order.objects.prefetch_related('items__product')
    #     serializer_class = OrderSerializer
    #     permission_classes = [IsAuthenticated]
    #     def get_queryset(self):
    #         qs =super().get_queryset()
    #         return qs.filter(user=self.request.user)
    

    자동으로 생성되는 URL 예시:

    /orders/            # GET: 전체 목록, POST: 생성
    /orders/<pk>/       # GET: 상세, PUT: 전체 수정, PATCH: 부분 수정, DELETE: 삭제
    

    4. 장점 요약

    • 코드량 감소: 중복 없이 하나의 ViewSet으로 CRUD 지원
    • 자동 URL 등록: router.register만으로 RESTful 경로 자동 생성
    • 유지보수 용이: 비즈니스 로직 변경 시 한 곳에서 수정 가능

    5. 필드 자동 생성 제어

    • 예: order_id는 UUIDField로 자동 생성되므로, 수동 입력 막기 위해 read_only 지정
    class OrderSerializer(serializers.ModelSerializer):
        order_id = serializers.UUIDField(read_only=True)
        ...
    

    6. Form 기반 HTML API 테스트

    • DRF 브라우저 UI에서 POST 요청 시 order_id를 수동으로 입력하라는 필드가 사라짐
    • ViewSet은 브라우저 기반 폼과도 잘 통합되어 시각적인 테스트가 가능함

    7. URL 접근 예시 및 테스트

    • /orders/ → 주문 전체 목록 조회 및 생성
    • /orders/<uuid>/ → 단일 주문 조회, 수정, 삭제
    • 폼에서 PUT 요청 보내면 자동으로 상태가 변경됨 (status = 'Confirmed' 등)

    8. 페이지네이션 해제 (뷰셋 별도 설정)

    class OrderViewSet(viewsets.ModelViewSet):
        queryset = Order.objects.all()
        serializer_class = OrderSerializer
        pagination_class = None  # 이 ViewSet에 한해 페이지네이션 제거
    

    9. 정리

    • ViewSet은 DRF에서 CRUD API 구현 시 매우 효율적인 구조를 제공
    • ModelViewSetDefaultRouter를 함께 사용하면 몇 줄의 코드로 전체 API 생성 가능
    • 다음 강의에서는 ViewSet에 사용자 정의 액션 추가 및 권한/필터링 적용을 다룹니다
    TOP
    preload preload